/*
 【递归】装信封问题
  题目描述
    某人写了 N 封信，用去 N 个信封，结果所有的信都装错了信封。
    求所有的信都装错信封共有多少种不同情况。可用下面公式（错位排列的递推公式）：
      基本形式：D(1) = 0; D(2) = 1
      递归形式：D(n) = (n-1) * (D(n-1) + D(n-2))
  输入
    一个正整数 N，N < 13。
  输出
    所有的信都装错信封的不同情况数。
  样例输入
    1
  样例输出
    0
 【特别说明】
    该题的题目描述中明确帮我们总结了 "递归退出条件" 和 "递归的 f(n) 和 其他的项之间的关系",
    需要想一下如果没有帮我们总结，我们能否自己总结出来!
*/

#include <bits/stdc++.h>

using namespace std;

// 该函数返回 "对于 n 封信, 所有的信都装错信封" 的所有可能的情况
int f (int n) {
    if (n == 1) {
        return 0;
    } else if(n == 2) {
        return 1;
    } else {
        return (n - 1) * (f(n - 1) + f(n - 2));
    }
}

int main() {
    int n;

    cin >> n;
    cout << f(n);

    return 0;
}